/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package pfc.arbol;

import java.io.File;
import java.io.FileOutputStream;
import java.io.ObjectOutputStream;
import java.util.ArrayList;
import java.util.Enumeration;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeModel;
import javax.swing.tree.TreeNode;
import org.apache.ddlutils.model.Database;
import pfc.comun.IDEpfc;
import pfc.comun.Proyecto;
import pfc.generacion.Application;
import pfc.generacion.ApplicationManager;
import pfc.interfaces.Salvable;
import pfc.modelocg.CGModel;
import pfc.modeloer.ERModel;
import pfc.utils.Utils;


/**
 *
 * @author xandru
 */
public class ArbolProyectos extends DefaultTreeModel implements Salvable {

    IDEpfc ide;

    public ArbolProyectos(TreeNode raiz, IDEpfc i) {
        super(raiz);
        ide = i;
    }

    public void addProyecto(Proyecto pro) {
        //System.out.println("kk1");
        DefaultMutableTreeNode raiz = (DefaultMutableTreeNode) this.getRoot();
        // System.out.println(raiz);
        // System.out.println(pro);
        ProyectoTreeNode n = construirArbolProyecto(pro);
        raiz.add(n);        
        //System.out.println( i );
        ide.addChanged(this);
    }

    public void save() {
        try {
            String path = ide.conf.getString("confdir");
            String file = path + File.separator + "tree.bin";

            FileOutputStream fos = new FileOutputStream(file);
            ObjectOutputStream oos = new ObjectOutputStream(fos);
            oos.writeObject(this);
        } catch (Exception e) {
            System.out.println(e.getMessage());
        }
    }

    public static ArbolProyectos load( IDEpfc ide ) {
        String path = ide.conf.getString("workdir");

        File dir = new File(path);

        ArbolProyectos a = new ArbolProyectos(new DefaultMutableTreeNode("/"), ide);
        File[] proyectos = dir.listFiles();
        for (int i=0; i<proyectos.length; i++)
        {
            String nombredir = proyectos[i].getAbsolutePath();
            String nombreproyecto = proyectos[i].getName();

            System.out.println("Creando proyecto desde ArbolProyectos");
            Proyecto p = new Proyecto(nombreproyecto,nombredir);
            a.addProyecto( p );
            ide.initAGuardar();
        }

        return a;


    }

    private ProyectoTreeNode construirArbolProyecto(Proyecto pro) {
        ProyectoTreeNode ptn = new ProyectoTreeNode(pro,pro.nombre);
           
        String dsFile = pro.path + File.separator + "db" + File.separator + pro.nombre + "-ds.properties";
        File f = new File(dsFile);
        if (f.exists())
        {
           DataSourceTreeNode ds = new DataSourceTreeNode(pro,"Origen Datos");
           ptn.add(ds);
        }


        //DBTreeNode db = new DBTreeNode(pro,"modelo datos");
        //ptn.add(db);
        DBTreeNode db=null;

        String dmFile = pro.path + File.separator + "db" + File.separator + "dbmodel-base.xml";
        Database dbmodel = null;
        f = new File(dmFile);
        if (f.exists())
        {
           db = new DBTreeNode(pro,"Modelo Datos");
           ptn.add(db);

           DataModelTreeNode dm = new DataModelTreeNode(pro,"base");
           dbmodel = Utils.XMLtoModel(dmFile);
           dm.setDBModel(dbmodel);
           db.add(dm);
        }


        String ermFile = pro.path + File.separator + "db" + File.separator + "ermodel.xml";
        f = new File(ermFile);
        if (f.exists())
        {
           ERModelTreeNode dm = new ERModelTreeNode(pro,"Modelo E-R");
           ERModel modelo = Utils.XMLToERModel(ermFile);
           modelo.setDatabaseModel(dbmodel);
           dm.buildTree( modelo );
           dm.setERModel(modelo);
           db.add(dm);
        }

        String cgFile = pro.path + File.separator + "cgmodel.xml";
        f = new File(cgFile);
        if (f.exists())
        {
           CGTreeNode cg = new CGTreeNode(pro,"Generacion Codigo");
           ERModel erModel = Utils.XMLToERModel(ermFile);
           erModel.setDatabaseModel(dbmodel);
           CGModel cgModel = CGModel.readFromFile(cgFile);
           cg.setCGModel(cgModel);
           cg.buildTree( cgModel, erModel, dbmodel );
           ptn.add(cg);
        }


        File dir = new File(pro.getAppsFolder());
        if (dir.isDirectory())
        {
            FolderTreeNode ftn = new FolderTreeNode(pro,"Aplicaciones");
            ApplicationManager appMgn = new ApplicationManager(ptn , pro);
            ptn.setAppManager(appMgn);
            ptn.setAppsFolder(ftn);
            ptn.add(ftn);
            for (File file : dir.listFiles())
            {
                if (file.isDirectory()){
                    Application p = new Application(file);
                    ApplicationTreeNode atn = new ApplicationTreeNode(pro,p);
                    appMgn.addApplication(p);
                    ftn.add(atn);
                }
            }
        }

        return ptn;
    }

    public Iterable<Proyecto> getProjectList() {
        ArrayList<Proyecto> resul = new ArrayList<Proyecto>();
        DefaultMutableTreeNode root = (DefaultMutableTreeNode)this.getRoot();
        for (Enumeration e = root.children();e.hasMoreElements();)
        {
            ProyectoTreeNode ptn = (ProyectoTreeNode)e.nextElement();
            resul.add(ptn.proyecto);
        }


        return resul;
    }
}
